package net.onceface.web.oauth2.domain;

import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.PreparedStatementSetter;
import org.springframework.stereotype.Repository;

@Repository("oauthRepositoryJdbc")
public class OauthRepositoryJdbc implements OauthRepository {

	private static OauthClientDetailsRowMapper oauthClientDetailsRowMapper = new OauthClientDetailsRowMapper();
	
	@Autowired
    private JdbcTemplate jdbcTemplate;
	
	@Override
	public OauthClientDetails findOauthClientDetails(String clientId) {
		final String sql = " select * from oauth_client_details where  client_id = ? ";
		final List<OauthClientDetails> list = this.jdbcTemplate.query(sql, new Object[]{clientId}, oauthClientDetailsRowMapper);
        return list.isEmpty() ? null : list.get(0);
	}

	@Override
	public List<OauthClientDetails> findAllOauthClientDetails() {
		final String sql = " select * from oauth_client_details order by create_time desc ";
        return this.jdbcTemplate.query(sql, oauthClientDetailsRowMapper);
	}

	@Override
	public void updateOauthClientDetailsArchive(String clientId, boolean archive) {
		final String sql = " update oauth_client_details set archived = ? where client_id = ? ";
        this.jdbcTemplate.update(sql, archive, clientId);
	}

	@Override
	public void saveOauthClientDetails(final OauthClientDetails clientDetails) {
		final String sql = " insert into oauth_client_details(client_id,resource_ids,client_secret,scope,authorized_grant_types,web_server_redirect_uri," +
                " authorities,access_token_validity,refresh_token_validity,additional_information,trusted,autoapprove) values (?,?,?,?,?,?,?,?,?,?,?,?)";

        this.jdbcTemplate.update(sql, new PreparedStatementSetter() {
            @Override
            public void setValues(PreparedStatement ps) throws SQLException {
                ps.setString(1, clientDetails.getClientId());
                ps.setString(2, clientDetails.getResourceIds());

                ps.setString(3, clientDetails.getClientSecret());
                ps.setString(4, clientDetails.getScope());

                ps.setString(5, clientDetails.getAuthorizedGrantTypes());
                ps.setString(6, clientDetails.getWebServerRedirectUri());

                ps.setString(7, clientDetails.getAuthorities());
                ps.setObject(8, clientDetails.getAccessTokenValidity());

                ps.setObject(9, clientDetails.getRefreshTokenValidity());
                ps.setString(10, clientDetails.getAdditionalInformation());

                ps.setBoolean(11, clientDetails.isTrusted());
                ps.setString(12, clientDetails.getAutoApprove());

            }
        });
    }

}
